home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / unixSyscall / wait.c < prev    next >
C/C++ Source or Header  |  1991-10-02  |  5KB  |  176 lines

  1. /* 
  2.  * wait.c --
  3.  *
  4.  *    Procedure to map from Unix wait system call to Sprite.
  5.  *
  6.  * Copyright (C) 1986 Regents of the University of California
  7.  * All rights reserved.
  8.  */
  9.  
  10. #ifndef lint
  11. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/wait.c,v 1.6 91/09/23 18:22:55 mottsmth Exp $ SPRITE (Berkeley)";
  12. #endif not lint
  13.  
  14. #include <sprite.h>
  15. #include <proc.h>
  16. #include <spriteTime.h>
  17.  
  18. #include "compatInt.h"
  19.  
  20. #include <sys/wait.h>
  21. #include <sys/time.h>
  22. #include <sys/resource.h>
  23. #include <status.h>
  24.  
  25.  
  26. /*
  27.  *----------------------------------------------------------------------
  28.  *
  29.  * wait --
  30.  *
  31.  *    Procedure to map from Unix wait system call to Sprite Proc_Wait.
  32.  *
  33.  * Results:
  34.  *    If wait returns due to a stopped or terminated child process,
  35.  *    the process ID of the child is returned to the calling process.
  36.  *    In addition, if statusPtr is non-null then fields in *statusPtr
  37.  *    will be set to contain the exit status of the child whose process
  38.  *    ID is returned.
  39.  *
  40.  *    Otherwise, UNIX_ERROR is returned and errno is set to indicate
  41.  *    the error.
  42.  *
  43.  * Side effects:
  44.  *    None.
  45.  *
  46.  *----------------------------------------------------------------------
  47.  */
  48.  
  49. int
  50. wait(statusPtr)
  51. union wait *statusPtr;
  52. {
  53.     ReturnStatus status;    /* result returned by Proc_Wait */
  54.     int pid;            /* process ID of child */
  55.     int reason;            /* reason child exited */
  56.     int childStatus;        /* returnStatus of child */
  57.     int subStatus;        /* additional signal status */
  58.     int    unixSignal;
  59.  
  60.     status = Proc_Wait(0, (int *) NULL, PROC_WAIT_BLOCK, &pid, &reason,
  61.             &childStatus, &subStatus, (Proc_ResUsage *) NULL);
  62.     if (status != SUCCESS) {
  63.     errno = Compat_MapCode(status);
  64.     return(UNIX_ERROR);
  65.     } else {
  66.     if (statusPtr != NULL)  {
  67.         statusPtr->w_status = 0;
  68.         if (reason == PROC_TERM_SUSPENDED) {
  69.         (void)Compat_SpriteSignalToUnix(childStatus, &unixSignal);
  70.         statusPtr->w_stopval = WSTOPPED;
  71.         statusPtr->w_stopsig = unixSignal;
  72.         } else if (reason == PROC_TERM_SIGNALED ||
  73.                reason == PROC_TERM_RESUMED) {
  74.         (void)Compat_SpriteSignalToUnix(childStatus, &unixSignal);
  75.         statusPtr->w_termsig = unixSignal;
  76.         /* NEED TO HANDLE coredump FIELD */
  77.         } else {
  78.         statusPtr->w_retcode = childStatus;
  79.         }
  80.     }
  81.     return((int) pid);
  82.     }
  83. }
  84.  
  85.  
  86. /*
  87.  *----------------------------------------------------------------------
  88.  *
  89.  * wait3 --
  90.  *
  91.  *    Procedure to map from Unix wait3 system call to Sprite Proc_Wait.
  92.  *
  93.  * Results:
  94.  *    If wait returns due to a stopped or terminated child process,
  95.  *    the process ID of the child is returned to the calling process.
  96.  *    In addition, if statusPtr is non-null then fields in *statusPtr
  97.  *    will be set to contain the exit status of the child whose process
  98.  *    ID is returned.
  99.  *
  100.  *    Otherwise, UNIX_ERROR is returned and errno is set to indicate
  101.  *    the error.
  102.  *
  103.  * Side effects:
  104.  *    None.
  105.  *
  106.  *----------------------------------------------------------------------
  107.  */
  108.  
  109. wait3(statusPtr, options, unixRusagePtr)
  110.     union    wait    *statusPtr;
  111.     int            options;
  112.     struct    rusage    *unixRusagePtr;
  113. {
  114.     Proc_ResUsage spriteRusage;
  115.     ReturnStatus status;    /* result returned by Proc_Wait */
  116.     int pid;            /* process ID of child */
  117.     int reason;            /* reason child exited */
  118.     int childStatus;        /* returnStatus of child */
  119.     int subStatus;        /* additional signal status */
  120.     int    flags = 0;
  121.  
  122.     if (!(options & WNOHANG)) {
  123.     flags |= PROC_WAIT_BLOCK;
  124.     }
  125.     if (options & WUNTRACED) {
  126.     flags |= PROC_WAIT_FOR_SUSPEND;
  127.     }
  128.  
  129.     status = Proc_Wait(0, (int *) NULL, flags, &pid, &reason, 
  130.         &childStatus, &subStatus, &spriteRusage);
  131.     if (status != SUCCESS) {
  132.     if ((status == PROC_NO_EXITS) && (options & WNOHANG)) {
  133.         return(0);
  134.     }
  135.     errno = Compat_MapCode(status);
  136.     return(UNIX_ERROR);
  137.     } else {
  138.     if (statusPtr != NULL)  {
  139.         int    unixSignal;
  140.         statusPtr->w_status = 0;
  141.         if (reason == PROC_TERM_SUSPENDED) {
  142.         (void)Compat_SpriteSignalToUnix(childStatus, &unixSignal);
  143.         statusPtr->w_stopval = WSTOPPED;
  144.         statusPtr->w_stopsig = unixSignal;
  145.         } else if (reason == PROC_TERM_SIGNALED ||
  146.                reason == PROC_TERM_RESUMED) {
  147.         (void)Compat_SpriteSignalToUnix(childStatus, &unixSignal);
  148.         statusPtr->w_termsig = unixSignal;
  149.         /* NEED TO HANDLE coredump FIELD */
  150.         } else {
  151.         statusPtr->w_retcode = childStatus;
  152.         }
  153.     }
  154.     if (unixRusagePtr != NULL) {
  155.         /*
  156.          * Return the total time used by the process and all its children.
  157.          */
  158.         Time totalKTime;
  159.         Time totalUTime;
  160.  
  161.         bzero((char *) unixRusagePtr, sizeof(*unixRusagePtr));
  162.         Time_Add(spriteRusage.userCpuUsage, spriteRusage.childUserCpuUsage,
  163.                         &totalUTime);
  164.         Time_Add(spriteRusage.kernelCpuUsage,
  165.              spriteRusage.childKernelCpuUsage, &totalKTime);
  166.         unixRusagePtr->ru_utime.tv_sec = totalUTime.seconds;
  167.         unixRusagePtr->ru_utime.tv_usec = totalUTime.microseconds;
  168.         unixRusagePtr->ru_stime.tv_sec = totalKTime.seconds;
  169.         unixRusagePtr->ru_stime.tv_usec = totalKTime.microseconds;
  170.         unixRusagePtr->ru_nvcsw = spriteRusage.numWaitEvents;
  171.         unixRusagePtr->ru_nivcsw = spriteRusage.numQuantumEnds;
  172.     }
  173.     return((int) pid);
  174.     }
  175. }
  176.